package cn.fornever.tools.db.assist.entity;

/**
 * 列信息.
 * <p>其中1~24对应DatabaseMetaData.getColumns()</p>
 * <p>25+为额外扩展的属性</p>
 *
 * @author ZhangAY
 */
public class ColumnInfo {
    /**
     * 1:Table Catlog.可能为 {@code null}
     */
    private String tableCat;
    /**
     * 2:Table Schem.可能为 {@code null}
     */
    private String tableSchem;
    /**
     * 3:表名
     */
    private String tableName;//3
    /**
     * 4:列名
     */
    private String columnName;
    /**
     * 5:数据类型
     *
     * @see java.sql.Types
     */
    private Integer dataType;
    /**
     * 6：类型名称
     */
    private String typeName;//6
    /**
     * 7:列的大小
     */
    private Integer columnSize;
    /**
     * 8:(未使用)
     */
    private Integer bufferLength;
    /**
     * 9.小数部分的位数.
     */
    private Integer decimalDigits;//9
    /**
     * 10:基数.通常为10或2
     */
    private Integer numPrecRadix;
    /**
     * 11:是否允许使用 {@code null}
     */
    private Integer nullable;
    /**
     * 12:列注释
     */
    private String remarks;//12
    /**
     * 13:该列的默认值
     */
    private String columnDef;
    /**
     * 14:SQL data type(未使用)
     */
    private Integer sqlDataType;
    /**
     * 15:SQL Datetime Sub(未使用)
     */
    private Integer sqlDatetimeSub;//15
    /**
     * 16:对于 char 类型,该长度是列中的最大字节数
     */
    private Integer charOctetLength;
    /**
     * 17:表中的列的索引(从1开始)
     */
    private Integer ordinalPosition;
    /**
     * 18:ISO 规则用于确定列是否包括 {@code null}.{@code "YES"} 允许;{@code "NO"} 不允许;{@code null} 不清楚是否允许.
     */
    private String isNullable;//18
    /**
     * 19:引用属性作用域的表的Catlog(如果 DATA_TYPE 不是 REF,则为 {@code null})
     */
    private String scopeCatlog;
    /**
     * 20;引用属性作用域的表的Schem(如果 DATA_TYPE 不是 REF,则为 {@code null})
     */
    private String scopeSchema;
    /**
     * 21:引用属性作用域的表的表名(如果 DATA_TYPE 不是 REF,则为 {@code null})
     */
    private String scopeTable;//21
    /**
     * 22:
     */
    private Short sourceDataType;
    /**
     * 23:是否自增长.{@code "YES"} 自增长;{@code "NO"} 不是自增长;空字符串 不清楚是否自增长.
     */
    private String isAutoincrement;
    /**
     * 24:是否自动生成.{@code "YES"} 自动生成;{@code "NO"} 不是自动生成;空字符串 不清楚是否自动生成.
     */
    private String isGeneratedcolumn;//24


    /**
     * 25. 扩展属性 java类型类名(不包含package).
     * <p>
     * 如"String"、"Integer"、"Byte[]"等
     */
    private String javaTypeName;


    /**
     * 26. 扩展属性 java.sql类型.
     * @see java.sql.SQLType
     * @see java.sql.JDBCType
     * @see java.sql.Types
     */
    private String jdbcTypeName;


    /**
     * 27. 扩展属性 java.sql类型类名.
     * 是否是主键.
     * <code>true<code/> 是主键,<code>false<code/> 不是主键.
     */
    private Boolean isPK;



    /**
     * 1:Table Catlog.可能为 {@code null}
     *
     * @return Table Catlog
     */
    public String getTableCat() {
        return tableCat;
    }

    /**
     * 1:Table Catlog.可能为 {@code null}
     *
     * @param tableCat Table Catlog
     */
    public void setTableCat(String tableCat) {
        this.tableCat = tableCat;
    }

    /**
     * 2:Table Schem.可能为 {@code null}
     *
     * @return Table Schem.
     */
    public String getTableSchem() {
        return tableSchem;
    }

    /**
     * 2:Table Schem.可能为 {@code null}
     *
     * @param tableSchem Table Schem.
     */
    public void setTableSchem(String tableSchem) {
        this.tableSchem = tableSchem;
    }

    /**
     * 3:Table Name.
     *
     * @return Table Name.
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 3:Table Name.
     *
     * @param tableName Table Name.
     */
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    /**
     * 4:列名.
     *
     * @return 列名
     */
    public String getColumnName() {
        return columnName;
    }

    /**
     * 4:列名
     *
     * @param columnName 列名
     */
    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    /**
     * 5:SQL Type
     *
     * @return SQL Type
     * @see java.sql.Types
     */
    public Integer getDataType() {
        return dataType;
    }

    /**
     * 5:SQL Type
     *
     * @param dataType SQL Type
     * @see java.sql.Types
     */
    public void setDataType(Integer dataType) {
        this.dataType = dataType;
    }

    /**
     * 6:数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
     *
     * @return 类型名称
     */
    public String getTypeName() {
        return typeName;
    }

    /**
     * 6:数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
     *
     * @param typeName 类型名称
     */
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    /**
     * 7:列的大小
     *
     * @return 列的大小
     */
    public Integer getColumnSize() {
        return columnSize;
    }

    /**
     * 7:列的大小
     *
     * @param columnSize 列的大小
     */
    public void setColumnSize(Integer columnSize) {
        this.columnSize = columnSize;
    }

    /**
     * 8:bufferLength(未被使用)
     *
     * @return bufferLength
     */
    public Integer getBufferLength() {
        return bufferLength;
    }

    /**
     * 8:bufferLength(未被使用)
     *
     * @param bufferLength bufferLength
     */
    public void setBufferLength(Integer bufferLength) {
        this.bufferLength = bufferLength;
    }

    /**
     * 9:小数部分的位数.对于 DECIMAL_DIGITS 不适用的数据类型,则返回 {@code null}
     *
     * @return 小数部分的位数
     */
    public Integer getDecimalDigits() {
        return decimalDigits;
    }

    /**
     * 9:小数部分的位数
     *
     * @param decimalDigits 小数部分的位数
     */
    public void setDecimalDigits(Integer decimalDigits) {
        this.decimalDigits = decimalDigits;
    }

    /**
     * 10:基数.通常为10或2
     *
     * @return 基数
     */
    public Integer getNumPrecRadix() {
        return numPrecRadix;
    }

    /**
     * 10:基数.通常为10或2
     *
     * @param numPrecRadix 基数.
     */
    public void setNumPrecRadix(Integer numPrecRadix) {
        this.numPrecRadix = numPrecRadix;
    }

    /**
     * 11:是否允许使用 {@code null}
     *
     * @return 是否允许使用 {@code null}
     */
    public Integer getNullable() {
        return nullable;
    }

    /**
     * 11:是否允许使用 {@code null}
     *
     * @param nullable 是否允许使用 {@code null}
     */
    public void setNullable(Integer nullable) {
        this.nullable = nullable;
    }

    /**
     * 12:列注释
     *
     * @return 列注释
     */
    public String getRemarks() {
        return remarks;
    }

    /**
     * 12:列注释
     *
     * @param remarks 列注释
     */
    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    /**
     * 13:该列的默认值,当值在单引号内时应被解释为一个字符串(可以为 {@code null})
     *
     * @return 该列的默认值
     */
    public String getColumnDef() {
        return columnDef;
    }

    /**
     * 13:该列的默认值
     *
     * @param columnDef 该列的默认值
     */
    public void setColumnDef(String columnDef) {
        this.columnDef = columnDef;
    }

    /**
     * 14:SQL data type(未使用)
     *
     * @return SQL data type
     */
    public Integer getSqlDataType() {
        return sqlDataType;
    }

    /**
     * 14:SQL data type(未使用)
     *
     * @param sqlDataType SQL data type
     */
    public void setSqlDataType(Integer sqlDataType) {
        this.sqlDataType = sqlDataType;
    }

    /**
     * 15:SQL Datetime Sub(未使用)
     *
     * @return SQL Datetime Sub
     */
    public Integer getSqlDatetimeSub() {
        return sqlDatetimeSub;
    }

    /**
     * 15:SQL Datetime Sub(未使用)
     *
     * @param sqlDatetimeSub SQL Datetime Sub
     */
    public void setSqlDatetimeSub(Integer sqlDatetimeSub) {
        this.sqlDatetimeSub = sqlDatetimeSub;
    }

    /**
     * 16:对于 char 类型,该长度是列中的最大字节数
     *
     * @return 列中的最大字节数
     */
    public Integer getCharOctetLength() {
        return charOctetLength;
    }

    /**
     * 16:对于 char 类型,该长度是列中的最大字节数
     *
     * @param charOctetLength 列中的最大字节数
     */
    public void setCharOctetLength(Integer charOctetLength) {
        this.charOctetLength = charOctetLength;
    }

    /**
     * 17:表中的列的索引(从1开始)
     *
     * @return 表中的列的索引(从1开始)
     */
    public Integer getOrdinalPosition() {
        return ordinalPosition;
    }

    /**
     * 17:表中的列的索引(从1开始)
     *
     * @param ordinalPosition 表中的列的索引(从1开始)
     */
    public void setOrdinalPosition(Integer ordinalPosition) {
        this.ordinalPosition = ordinalPosition;
    }

    /**
     * 18:ISO 规则用于确定列是否包括 {@code null}
     *
     * @return 列是否包括 {@code null}.{@code "YES"} 允许;{@code "NO"} 不允许;{@code null} 不清楚是否允许.
     */
    public String getIsNullable() {
        return isNullable;
    }

    /**
     * 18:ISO 规则用于确定列是否包括 {@code null}
     *
     * @param isNullable 列是否包括 {@code null}.{@code "YES"} 允许;{@code "NO"} 不允许;{@code null} 不清楚是否允许.
     */
    public void setIsNullable(String isNullable) {
        this.isNullable = isNullable;
    }

    /**
     * 19:引用属性作用域的表的Catlog(如果 DATA_TYPE 不是 REF,则为 {@code null})
     *
     * @return 引用属性作用域的表的Catlog(如果 DATA_TYPE 不是 REF, 则为 {@code null})
     */
    public String getScopeCatlog() {
        return scopeCatlog;
    }

    /**
     * 19:引用属性作用域的表的Catlog(如果 DATA_TYPE 不是 REF,则为 {@code null})
     *
     * @param scopeCatlog 引用属性作用域的表的Catlog(如果 DATA_TYPE 不是 REF,则为 {@code null})
     */
    public void setScopeCatlog(String scopeCatlog) {
        this.scopeCatlog = scopeCatlog;
    }

    /**
     * 20:引用属性作用域的表的Schem(如果 DATA_TYPE 不是 REF,则为 {@code null})
     *
     * @return 引用属性作用域的表的Schem(如果 DATA_TYPE 不是 REF, 则为 {@code null})
     */
    public String getScopeSchema() {
        return scopeSchema;
    }

    /**
     * 20:引用属性作用域的表的Schem(如果 DATA_TYPE 不是 REF,则为 {@code null})
     *
     * @param scopeSchema 引用属性作用域的表的Schem(如果 DATA_TYPE 不是 REF,则为 {@code null})
     */
    public void setScopeSchema(String scopeSchema) {
        this.scopeSchema = scopeSchema;
    }

    /**
     * 21:引用属性作用域的表的表名(如果 DATA_TYPE 不是 REF,则为 {@code null})
     *
     * @return 引用属性作用域的表的表名(如果 DATA_TYPE 不是 REF, 则为 {@code null})
     */
    public String getScopeTable() {
        return scopeTable;
    }

    /**
     * 21:引用属性作用域的表的表名(如果 DATA_TYPE 不是 REF,则为 {@code null})
     *
     * @param scopeTable 引用属性作用域的表的表名(如果 DATA_TYPE 不是 REF,则为 {@code null})
     */
    public void setScopeTable(String scopeTable) {
        this.scopeTable = scopeTable;
    }

    /**
     * 22:不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
     *
     * @return 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
     */
    public Short getSourceDataType() {
        return sourceDataType;
    }

    /**
     * 22:不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
     *
     * @param sourceDataType 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为 null)
     */
    public void setSourceDataType(Short sourceDataType) {
        this.sourceDataType = sourceDataType;
    }

    /**
     * 23:是否自增长.
     *
     * @return {@code "YES"} 自增长;{@code "NO"} 不是自增长;空字符串 不清楚是否自增长.
     */
    public String getIsAutoincrement() {
        return isAutoincrement;
    }

    /**
     * 23:是否自增长.
     *
     * @param isAutoincrement {@code "YES"} 自增长;{@code "NO"} 不是自增长;空字符串 不清楚是否自增长.
     */
    public void setIsAutoincrement(String isAutoincrement) {
        this.isAutoincrement = isAutoincrement;
    }

    /**
     * 24:是否自动生成.
     *
     * @return {@code "YES"} 自动生成;{@code "NO"} 不是自动生成;空字符串 不清楚是否自动生成.
     */
    public String getIsGeneratedcolumn() {
        return isGeneratedcolumn;
    }

    /**
     * 24:是否自动生成.
     *
     * @param isGeneratedcolumn {@code "YES"} 自动生成;{@code "NO"} 不是自动生成;空字符串 不清楚是否自动生成.
     */
    public void setIsGeneratedcolumn(String isGeneratedcolumn) {
        this.isGeneratedcolumn = isGeneratedcolumn;
    }

    public String getJavaTypeName() {
        return javaTypeName;
    }

    public void setJavaTypeName(String javaTypeName) {
        this.javaTypeName = javaTypeName;
    }

    public String getJdbcTypeName() {
        return jdbcTypeName;
    }

    public void setJdbcTypeName(String jdbcTypeName) {
        this.jdbcTypeName = jdbcTypeName;
    }

    public Boolean getPK() {
        return isPK;
    }

    public void setPK(Boolean PK) {
        isPK = PK;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ColumnInfo that = (ColumnInfo) o;

        if (tableCat != null ? !tableCat.equals(that.tableCat) : that.tableCat != null) return false;
        if (tableSchem != null ? !tableSchem.equals(that.tableSchem) : that.tableSchem != null) return false;
        if (tableName != null ? !tableName.equals(that.tableName) : that.tableName != null) return false;
        if (columnName != null ? !columnName.equals(that.columnName) : that.columnName != null) return false;
        if (dataType != null ? !dataType.equals(that.dataType) : that.dataType != null) return false;
        if (typeName != null ? !typeName.equals(that.typeName) : that.typeName != null) return false;
        if (columnSize != null ? !columnSize.equals(that.columnSize) : that.columnSize != null) return false;
        if (bufferLength != null ? !bufferLength.equals(that.bufferLength) : that.bufferLength != null) return false;
        if (decimalDigits != null ? !decimalDigits.equals(that.decimalDigits) : that.decimalDigits != null)
            return false;
        if (numPrecRadix != null ? !numPrecRadix.equals(that.numPrecRadix) : that.numPrecRadix != null) return false;
        if (nullable != null ? !nullable.equals(that.nullable) : that.nullable != null) return false;
        if (remarks != null ? !remarks.equals(that.remarks) : that.remarks != null) return false;
        if (columnDef != null ? !columnDef.equals(that.columnDef) : that.columnDef != null) return false;
        if (sqlDataType != null ? !sqlDataType.equals(that.sqlDataType) : that.sqlDataType != null) return false;
        if (sqlDatetimeSub != null ? !sqlDatetimeSub.equals(that.sqlDatetimeSub) : that.sqlDatetimeSub != null)
            return false;
        if (charOctetLength != null ? !charOctetLength.equals(that.charOctetLength) : that.charOctetLength != null)
            return false;
        if (ordinalPosition != null ? !ordinalPosition.equals(that.ordinalPosition) : that.ordinalPosition != null)
            return false;
        if (isNullable != null ? !isNullable.equals(that.isNullable) : that.isNullable != null) return false;
        if (scopeCatlog != null ? !scopeCatlog.equals(that.scopeCatlog) : that.scopeCatlog != null) return false;
        if (scopeSchema != null ? !scopeSchema.equals(that.scopeSchema) : that.scopeSchema != null) return false;
        if (scopeTable != null ? !scopeTable.equals(that.scopeTable) : that.scopeTable != null) return false;
        if (sourceDataType != null ? !sourceDataType.equals(that.sourceDataType) : that.sourceDataType != null)
            return false;
        if (isAutoincrement != null ? !isAutoincrement.equals(that.isAutoincrement) : that.isAutoincrement != null)
            return false;
        if (isGeneratedcolumn != null ? !isGeneratedcolumn.equals(that.isGeneratedcolumn) : that.isGeneratedcolumn != null)
            return false;
        if (javaTypeName != null ? !javaTypeName.equals(that.javaTypeName) : that.javaTypeName != null) return false;
        if (jdbcTypeName != null ? !jdbcTypeName.equals(that.jdbcTypeName) : that.jdbcTypeName != null) return false;
        return isPK != null ? isPK.equals(that.isPK) : that.isPK == null;
    }

    @Override
    public int hashCode() {
        int result = tableCat != null ? tableCat.hashCode() : 0;
        result = 31 * result + (tableSchem != null ? tableSchem.hashCode() : 0);
        result = 31 * result + (tableName != null ? tableName.hashCode() : 0);
        result = 31 * result + (columnName != null ? columnName.hashCode() : 0);
        result = 31 * result + (dataType != null ? dataType.hashCode() : 0);
        result = 31 * result + (typeName != null ? typeName.hashCode() : 0);
        result = 31 * result + (columnSize != null ? columnSize.hashCode() : 0);
        result = 31 * result + (bufferLength != null ? bufferLength.hashCode() : 0);
        result = 31 * result + (decimalDigits != null ? decimalDigits.hashCode() : 0);
        result = 31 * result + (numPrecRadix != null ? numPrecRadix.hashCode() : 0);
        result = 31 * result + (nullable != null ? nullable.hashCode() : 0);
        result = 31 * result + (remarks != null ? remarks.hashCode() : 0);
        result = 31 * result + (columnDef != null ? columnDef.hashCode() : 0);
        result = 31 * result + (sqlDataType != null ? sqlDataType.hashCode() : 0);
        result = 31 * result + (sqlDatetimeSub != null ? sqlDatetimeSub.hashCode() : 0);
        result = 31 * result + (charOctetLength != null ? charOctetLength.hashCode() : 0);
        result = 31 * result + (ordinalPosition != null ? ordinalPosition.hashCode() : 0);
        result = 31 * result + (isNullable != null ? isNullable.hashCode() : 0);
        result = 31 * result + (scopeCatlog != null ? scopeCatlog.hashCode() : 0);
        result = 31 * result + (scopeSchema != null ? scopeSchema.hashCode() : 0);
        result = 31 * result + (scopeTable != null ? scopeTable.hashCode() : 0);
        result = 31 * result + (sourceDataType != null ? sourceDataType.hashCode() : 0);
        result = 31 * result + (isAutoincrement != null ? isAutoincrement.hashCode() : 0);
        result = 31 * result + (isGeneratedcolumn != null ? isGeneratedcolumn.hashCode() : 0);
        result = 31 * result + (javaTypeName != null ? javaTypeName.hashCode() : 0);
        result = 31 * result + (jdbcTypeName != null ? jdbcTypeName.hashCode() : 0);
        result = 31 * result + (isPK != null ? isPK.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("ColumnInfo{");
        sb.append("tableCat='").append(tableCat).append('\'');
        sb.append(", tableSchem='").append(tableSchem).append('\'');
        sb.append(", tableName='").append(tableName).append('\'');
        sb.append(", columnName='").append(columnName).append('\'');
        sb.append(", dataType=").append(dataType);
        sb.append(", typeName='").append(typeName).append('\'');
        sb.append(", columnSize=").append(columnSize);
        sb.append(", bufferLength=").append(bufferLength);
        sb.append(", decimalDigits=").append(decimalDigits);
        sb.append(", numPrecRadix=").append(numPrecRadix);
        sb.append(", nullable=").append(nullable);
        sb.append(", remarks='").append(remarks).append('\'');
        sb.append(", columnDef='").append(columnDef).append('\'');
        sb.append(", sqlDataType=").append(sqlDataType);
        sb.append(", sqlDatetimeSub=").append(sqlDatetimeSub);
        sb.append(", charOctetLength=").append(charOctetLength);
        sb.append(", ordinalPosition=").append(ordinalPosition);
        sb.append(", isNullable='").append(isNullable).append('\'');
        sb.append(", scopeCatlog='").append(scopeCatlog).append('\'');
        sb.append(", scopeSchema='").append(scopeSchema).append('\'');
        sb.append(", scopeTable='").append(scopeTable).append('\'');
        sb.append(", sourceDataType=").append(sourceDataType);
        sb.append(", isAutoincrement='").append(isAutoincrement).append('\'');
        sb.append(", isGeneratedcolumn='").append(isGeneratedcolumn).append('\'');
        sb.append(", javaTypeName='").append(javaTypeName).append('\'');
        sb.append(", jdbcTypeName='").append(jdbcTypeName).append('\'');
        sb.append(", isPK=").append(isPK);
        sb.append('}');
        return sb.toString();
    }
}
